Chapter 2 アセンブラ学習とMakefile入門
entryが0x7c50
0x50がプログラム本体の開始部分(下図)
どうしてこうなるのかはわからないkadoyau.icon
msgが0x7c74
https://gyazo.com/6614b921a08d70f4e91769fff716c09f
でORG 0x7c00をしているので0x7c74にメッセージがある
putloopの説明
BL, BHが指定されていないけどいいの?kadoyau.icon
Wikiには
BL = カラーコード; ※(ここでカラーコードを指定するには上のビデオモード設定で、「VGAグラフィックス」をで設定しなければならない。)
初期値0になる?
これからもいろいろ「なぜ?」が出てくると思いますが、結局のところ、それはみんな IBM のおじさん たちやインテルのおじさんたちが勝手に決めたことなのです。まあ深く調べると当時なりの理由が結構 あるわけですが(略)
NASMでhelloos3のimageが生成できない
code:helloos3
$ nasm helloos.nas -o helloos.img
helloos.nas:58: error: attempt to reserve non-constant quantity of BSS space
RESB 0x7dfe-$でコケている
RESB 0x1fe-($-$$)にするとimageが生成できる
この値の意味は0x7DFE-($-$$)-0x7C00
ORG 0x7c00なので、この分のオフセットを引いている
NASM supports two special tokens in expressions, allowing calculations to involve the current assembly position: the $ and $$ tokens.
$ evaluates to the assembly position at the beginning of the line containing the expression; so you can code an infinite loop using JMP $.
$$ evaluates to the beginning of the current section; so you can tell how far into the section you are by using ($-$$).
誤って0x7dfe-($-$$)にしたら実行できなかった
https://gyazo.com/4cb565550b7158317841c2aa66d44953
最初のセクタの最後の2バイトが55 AAと書き込まれていないのでbootのプログラムと判定されていない(p.28 ブートセクタの注釈)
https://gyazo.com/0a307e14c34ed3b4d5899774bf0fe883
p.43 ブートセクタだけを作るように整理
asm.bat
(ipl.nas) => (ipl.bin, ipl.lst)
lstは命令がどの機械語に翻訳されたか確認するためのファイル
makeimg.bat
(ipl.bin) => helloos.img
いままでは(helloos.nas) => helloos.imgだったのが中間ファイルが出るようになった
NASMだとどうやるの?
code:heloos4
$ nasm ipl.nas -o ipl.bin -l ipl.lst
ipl.nas:27: warning: uninitialized space declared in .text section: zeroing -w+other ipl.nas:58: warning: uninitialized space declared in .text section: zeroing -w+other $ qemu-system-i386 ipl.bin
makeimg.bat相当の手順が謎
ここから実行環境をWindows10に切り替えました
VMでやると面倒なことが増えそうな雰囲気
消費電力、GUI周りのハマり
Linuxのデスクトップ環境を持っていない
macOSはCatalinaなので利用できない
じゃあWindows10でやろう
Makefileの実行は含まれているmake.exeを呼び出せばよい。環境変数をセットするかわりにこれを呼び出すバッチ(make.bat)が用意されているのでこれを毎回コピーして使う
中身はただmakeを呼び出しているだけ
code:make.bat
..\z_tools\make.exe %1 %2 %3 %4 %5 %6 %7 %8 %9
CPUは与えられた命令を実行するだけ。アセンブリがおかしければ変な動作をする。事故防止のための機能を持っているが、OSが提供する。我々はOSをつくっているので事故る可能性がある。